package com.libinshen.wxpay.login.controller;

import com.libinshen.wxpay.common.vo.CommonResult;
import com.libinshen.wxpay.login.entity.SoftWareInfo;
import com.libinshen.wxpay.login.entity.miniapp.AppAuthLoginRespVO;
import com.libinshen.wxpay.login.entity.miniapp.AuthLoginReqVO;
import com.libinshen.wxpay.login.service.UserInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Api(tags = "普通登录接口")
@RestController
@RequestMapping("/login")
@Slf4j
public class UserInfoController {

    @Autowired
    private UserInfoService userInfoService;


    /****
     *登录接口：1：验证userName and password 2:使用JWT 创建token ，token 中包含过期时间
     *   1: 前端带着userName  pwd  登录  返回token refreshtoken（典型的Oauth2.0 协议）
     *   2: 每次访问其他接口就带着token,会被统一拦截器 去验证token,
     *         2.1：如果过期就返回token 已经过期，前端重定向到登录页面。
     *         2.2：如果过期返回前端token已过期，前端请求刷新token 接口。带着refrestoken
     *         2.3:如果快过期，就需要去重置他的过期时间。 时间必须放在redis.token 这种用户态字段必须放在redis中
     *   3:
     *
     *  token 验证成功之后，从token中获取用户信息，并将用户信息存放在Spring Security中，
     *  每次使用都可以使用SpringSecurity Contetxt获取用户信息
     *   登录类型：
     *   1：使用账号登录
     *   2：使用社交登录
     *   3：使用短信登陆
     *   4：使用手机登陆
     * @param reqVO
     * @return
     */
    @ApiOperation("用户登录,用户名密码必传。已经测试完成")
    @ResponseBody
    @PostMapping("/login")
    public CommonResult<AppAuthLoginRespVO> login(@RequestBody AuthLoginReqVO user) {
        return CommonResult.success(userInfoService.login(user));
    }


    @ApiOperation("用户注册。已经测试完成")
    @ResponseBody
    @PostMapping("/register")
    public CommonResult<AppAuthLoginRespVO> register(@RequestBody AuthLoginReqVO user, HttpServletRequest request) {
        return CommonResult.success(userInfoService.register(user, request));
    }

    @ApiOperation("用户退出")
    @ResponseBody
    @GetMapping("/signOut")
    public CommonResult<Boolean> signOut(Long userId) {
        userInfoService.signOut(userId);
        return CommonResult.success(true);
    }

    @ApiOperation("用户注销，如果是app,上架应用商店必须要有注销功能，逻辑注销，7天之内登录账户账号可以正常使用，7天之后无法使用")
    @ResponseBody
    @GetMapping("/logOut")
    public CommonResult<Boolean> logOut(AuthLoginReqVO authLoginReqVO) {
        userInfoService.logOut(authLoginReqVO);
        return CommonResult.success(true);
    }

    @ApiOperation("账户锁定，根据手机设备号，锁定软件")
    @ResponseBody
    @GetMapping("/lockSoftWare")
    public CommonResult<Boolean> lockSoftWare(AuthLoginReqVO authLoginReqVO) {
        userInfoService.lockSoftWare(authLoginReqVO);
        return CommonResult.success(true);
    }

    @ApiOperation("修改用户信息")
    @ResponseBody
    @PostMapping("/changeUserInfo")
    public CommonResult<Boolean> updateUserInfo(@RequestBody AuthLoginReqVO authLoginReqVO) {
        userInfoService.updateUserInfo(authLoginReqVO);
        return CommonResult.success(true);
    }

    @ApiOperation("如果是app ,获取app迭代版本号{{测试成功}}")
    @ResponseBody
    @GetMapping("/getSoftWareInfomation")
    public CommonResult<SoftWareInfo> getSoftWareInfomation() {
        return CommonResult.success(userInfoService.getSoftWareInfomation());
    }
}
